<?php

/**
 * StaticRoute is used for managing static URIs.
 */
class Jf_Controller_Route_Static implements Jf_Controller_Route_Interface {

    /**
     * Class constructor
     */
    public function __construct () {}

    /**
     *
     * @todo this method is not used anywhere
     * @param string $uri
     * @return bool
     */
    public function match ($uri) {
        return true;
    }

    /**
     * Processes a request and sets its controller and action.
     * If
     * no route was possible, default route is set.
     * @param Jf_Controller_Request_Abstract
     * @return Jf_Controller_Request_Abstract boolean
     */
    public function route (Jf_Controller_Request_Abstract $request) {
        $path = $request -> getRequestPath ();
        $module = null;
        $controller = null;
        $action = null;
        $rest = null;
        $path = trim ($path, Jf_Controller_Router::URI_DELIMITER);
        if ( ! $path) {
            return false;
        }
        $path = explode (Jf_Controller_Router::URI_DELIMITER, $path);
        $path = array_filter ($path, 'strlen');
        if (Jf_Application::isModuleName ($path[0])) {
            $module = $path[0];
            array_shift ($path);
        }
        if (count ($path) &&  ! empty ($path[0])) {
            $controller = $path[0];
            array_shift ($path);
        }
        if (count ($path) &&  ! empty ($path[0])) {
            $action = $path[0];
            array_shift ($path);
        }
        $rest = implode (Jf_Controller_Router::URI_DELIMITER, $path);
        $actionPrefer = Jf_Global::iniGet ('Jf.action_prefer');
        if ($module == null && $controller == null && $action == null) {
            if ($actionPrefer == true) {
                $action = $rest;
            } else {
                $controller = $rest;
            }
            $rest = null;
        } elseif ($module == null && $action == null && $rest == null) {
            if ($actionPrefer == true) {
                $action = $controller;
                $controller = null;
            }
        } elseif ($controller == null && $action == null && $rest != null) {
            $controller = $module;
            $action = $rest;
            $module = null;
            $rest = null;
        } elseif ($action == null) {
            $action = $rest;
            $rest = null;
        }
        if ($module != null) {
            $request -> setModuleName ($module);
        }
        if ($controller != null) {
            $request -> setControllerName ($controller);
        }
        if ($action != null) {
            $request -> setActionName ($action);
        }
        $params = array();
        if ($rest != null && trim ($rest) != '') {
            $path = explode (Jf_Controller_Router::URI_DELIMITER, $rest);
            if (($numSegs = count ($path)) != 0) {
                for ($i = 0; $i < $numSegs; $i = $i + 2) {
                    $key = urldecode ($path[$i]);
                    $val = isset ($path[$i + 1]) ? urldecode ($path[$i + 1]) : null;
                    $params[$key] = (isset ($params[$key]) ? (array_merge ((array) $params[$key], array($val))) : $val);
                }
            }
            $request -> setParam ($params);
        }
        return true;
    }

    /**
     * used to create routes on the fly from config
     * @param array $config
     */
    public function getInstance (array $config) {
        return new self ();
    }

}
